#!/usr/bin/php -q
<?php
//
// command line utility to compile less to stdout
// leaf corcoran <leafo.net>
$VERSION = "v0.2.1";

error_reporting(E_ALL);
$path  = realpath(dirname(__FILE__)).'/';

require $path."lessc.inc.php";

$fa = "Fatal Error: ";
function err($msg) {
	fwrite(STDERR, $msg."\n");
}

if (php_sapi_name() != "cli") { 
	err($fa.$argv[0]." must be run in the command line.");
	exit(1);
}
$exe = array_shift($argv); // remove filename

function process($data, $import = null) {
	global $fa;

	$l = new lessc();
	if ($import) $l->importDir = $import;
	try {
		echo $l->parse($data);
		exit(0);
	} catch (exception $ex) {
		err($fa."\n".str_repeat('=', 20)."\n".
			$ex->getMessage());
		exit(1);
	}
}

// process args
$opts = array();
foreach ($argv as $loc => $a) {
	if (preg_match("/^-([a-zA-Z]+)$/", $a, $m)) {
		$m = $m[1];
		for ($i = 0; $i < strlen($m); $i++)
			$opts[$m{$i}] = $loc;
		unset($argv[$loc]);
	}
}

function has($o, &$loc = null)
{
	global $opts;
	if (!isset($opts[$o])) return false;
	$loc = $opts[$o];
	return true;
}

function hasValue($o, &$value = null)
{
	global $argv;
	if (!has($o,$loc)) return false;
	if (!isset($argv[$loc+1])) return false;
	$value = $argv[$loc+1];
	return true;
}

if (has("v")) {
	exit($VERSION."\n");
}

if (has("r", $loc)) {
	if (!hasValue("r", $data)) {
		while (!feof(STDIN)) {
			$data .= fread(STDIN, 8192);
		}
	}
	return process($data);
}

if (has("w")) {
	// need two files
	if (!is_file($in = array_shift($argv)) || 
		null == $out = array_shift($argv))
	{
		err($fa.$exe." -w infile outfile");
		exit(1);
	}

	echo "Watching ".$in.
		(has("n") ? ' with notifications' : '').
		", press Ctrl + c to exit.\n";

	$fail_time = 0;
	// $l = new lessc($in);
	$cache = $in;
	$last_build = 0;
	while (1) {
		// check if anything has changed since last fail
		$updated = false;
		if (is_array($cache)) {
			foreach ($cache['files'] as $fname=>$_) {
				if (filemtime($fname) > $fail_time) {
					$updated = true;
					break;
				}
			}
		} else $updated = true;

		// try to compile it
		if ($updated) try {
			$cache = lessc::cexecute($cache);
			if ($cache['updated'] > $last_build) {
				$last_build = $cache['updated'];
				echo "Writing updated file: ".$out."\n";	
				if (!file_put_contents($out, $cache['compiled'])) {
					err($fa."Could not write to file ".$out);
					exit(1);
				}
			}
		} catch (exception $ex) {
			echo "\nFatal Error:\n".str_repeat('=', 20)."\n".$ex->getMessage()."\n\n";
			$fail_time = time();

			if (has("n")) { 
				`notify-send -u critical "compile failed" "{$ex->getMessage()}"`;
			}
		}

		sleep(1);
	}
	exit(0);
}

if (!$fname = array_shift($argv)) {
	echo "Usage: ".$exe." input-file [output-file]\n";
	exit(1);
}

try {
	$l = new lessc($fname);
	$out =  $l->parse();

	if (!$fout = array_shift($argv)) {
		echo $out;
	} else {
		file_put_contents($fout, $out);
	}

} catch (exception $ex) {
	err($fa.$ex->getMessage());
	exit(1);
}


?>
